package com.example.MyReflection.Reflect;

import com.example.MyReflection.Service.UserService;
import com.example.MyReflection.Service.impl.UserServiceImpl;
import com.example.MyReflection.dao.UserDao;
import com.example.MyReflection.dao.impl.UserDaoImpl;
import com.example.Utils.ScanUtils;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;

/**
 * @author cc
 * @date 2021/7/30 20:37
 * @Description  扫描项目的所有包，并把这些包放入到Hashmap这个集合中
 */

public class ApplicationContext<T> {
    private HashMap<Class,Object> beanFactory =new HashMap<>();



    //拿bean对象
    public T getBean(Class clazz){
        return (T)beanFactory.get(clazz);
    }

    /**
     * 通过初始化来完成反射
     * @author sosmcc
     * @param
     */
    //放bean对象
    public void initContext(){

        //通过读配置文件的形式
        InputStream resource = ApplicationContext.class.getClassLoader().getResourceAsStream("com/example/Config/bean.config");
        Properties properties =  new Properties();
        try {
            properties.load(resource);
            Set<Object> keySet = properties.keySet() ;
            for (Object o : keySet) {
                //newInstance实列化这个对象 （studentservice） 相当于  StudentService st = new StudentService
                beanFactory.put(Class.forName(o.toString()),Class.forName(properties.getProperty(o.toString())).newInstance());

            }
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }

    /**
     * 通过注解完成反射
     * @author sosmcc
     * @param
     */
    public void initContextByAnnotation(){
        //扫描包,并把所有类放入到容器里（即放入工厂beanFactory ）
        beanFactory = ScanUtils.load();
    }


}
